package net.ib.mtalk.ui.start;

import java.util.ArrayList;
import java.util.List;

import net.ib.mtalk.global.GlobalPreferences;

/**
 * <H1>사용자 환경설정을 좀더 쉽게 하기 위한 함수</H1><br/>
 * 
 * setList에서 예와 같이 Type과 리소스 들로 StartPreference 객체를 생성한 후에 넘김 <br/>
 * Type은 세가지가 있음(추후 확장 가능): List, Check, EditText<br/>
 * PreferenceActivity에서 preferences는 String과 boolean만 지원하므로 
 * Check를 제외한 두가지 타입은 SharedPreferences 객체를 얻은다음 putString을 함.<br/>
 * 
 * 
 * @author urunimi
 *
 */
public class StartManager {
	public static final int TYPE_LIST = 0x00;
	public static final int TYPE_CHECK = 0x01;
	public static final int TYPE_EDIT = 0x02;
	
	static List<StartPreference> mPrefsList;

	public static List<StartPreference> getInstance() {
		synchronized (StartManager.class) {
			if(mPrefsList == null) {
				mPrefsList = new ArrayList<StartPreference>();
				setList();
			}
		}
		return mPrefsList;
	}

	public static void reset() {
		synchronized (StartManager.class) {
			mPrefsList = null;
		}
	}
	
	/**
	 * TYPE_LIST인 경우: 키와 리소스들 연결하고 맨 마지막 변수는 default값. 리스트이기 때문에 0부터의 순서를 확인하여 숫자를 넣어줘야 한다.
	 * TYPE_CHECK인 경우: 역시 리소스들을 연결 한 후 default값(true or false)를 넣어준다.
	 */
	private static void setList() {
//		add(new StartPreference(TYPE_LIST, PrefsConstant.PRF_SORT_GROUP
//				R.string.settings_date_format, R.string.settings_date_format_summary, 
//				R.array.settings_date_format_entries, R.array.settings_date_format_entriesvalues, 
//				1));

//		add(new StartPreference(TYPE_CHECK, AutoPrefs.PRF_CONSTANT_RECORD,
//				R.string.settings_constant_record, R.string.settings_constant_record_summary, true));
		
	}

	/**
	 * StartPreference를 생성하여 넘기면 설정값이 preference에 있는지 없는지 검사하는 함수
	 * 만약 없다면 StartManager의 리스트에 add해줌
	 * @param context
	 * @param pref
	 * @return
	 */
	private static boolean add(StartPreference pref) {
		boolean result = false;
		if(pref != null && pref.mPrefKey != null && !GlobalPreferences.getSharedPreferences().contains(pref.mPrefKey)) {
			mPrefsList.add(pref);
			result = true;
		} else result = false;
		return result;
	}
	
	private StartManager() {}
	
	public static class StartPreference {
		
		private int mType;
		private String mPrefKey;
		private int mTitle;
		private int mSummary;
		private int mEntries;
		private int mEntryValues;
		private int mDefaultPosition = 0;
		private String mDefaultText = "";
		
		/**
		 * Text Type
		 * @param type
		 * @param prefKey
		 * @param key
		 * @param summary
		 * @param defaultCheck
		 */
		private StartPreference(int type, String prefKey, int key, int summary) {
			this.mType = type;
			this.mPrefKey = prefKey;
			this.mTitle = key;
			this.mSummary = summary;
		}
		
		/**
		 * Check Type
		 * @param type
		 * @param prefKey
		 * @param key
		 * @param summary
		 * @param defaultCheck
		 */
		private StartPreference(int type, String prefKey, int key, int summary, boolean defaultCheck) {
			this.mType = type;
			this.mPrefKey = prefKey;
			this.mTitle = key;
			this.mSummary = summary;
			if(defaultCheck) this.mDefaultPosition = 0;
			else this.mDefaultPosition = 1;
		}
		
		/**
		 * Text Type
		 * @param type
		 * @param prefKey
		 * @param key
		 * @param summary
		 * @param defaultCheck
		 */
		private StartPreference(int type, String prefKey, int key, int summary, String defaultText) {
			this.mType = type;
			this.mPrefKey = prefKey;
			this.mTitle = key;
			this.mSummary = summary;
			this.mDefaultText = defaultText;
		}
		
		/**
		 * List Type
		 * @param type
		 * @param prefKey
		 * @param title
		 * @param summary
		 * @param entry
		 * @param entryValues
		 * @param defaultPosition
		 */
		private StartPreference(int type, String prefKey, int title, int summary, int entry, int entryValues, int defaultPosition) {
			this.mType = type;
			this.mPrefKey = prefKey;
			this.mTitle = title;
			this.mSummary = summary;
			this.mEntries = entry;
			this.mEntryValues = entryValues;
			this.mDefaultPosition = defaultPosition;
		}
		
		public int getType() {
			return mType;
		}

		public String getPrefKey() {
			return mPrefKey;
		}

		public int getTitle() {
			return mTitle;
		}

		public int getSummary() {
			return mSummary;
		}

		public int getEntries() {
			return mEntries;
		}

		public int getEntryValues() {
			return mEntryValues;
		}

		public int getDefaultPosition() {
			return mDefaultPosition;
		}

		public String getDefaultText() {
			return mDefaultText;
		}
	}
}
